#include "app_pool.h"

static char *mqueue_name = "/pool_mqueue"; // 消息队列名称
static mqd_t mqueue_mark;                  // 消息队列标识符

static pthread_t *thread_pool = NULL; // 线程池
static int thread_pool_size = 0;      // 线程池大小

// 线程池中线程函数
static void *thread_task(void *args)
{
    Task task; // 收到的任务
    while (1)
    {
        // 从消息队列中获取任务
        mq_receive(mqueue_mark, (char *)&task, sizeof(Task), 0);
        // 执行任务
        task.task_func(task.arg);
    }
    return NULL;
}

int app_pool_init(int pool_size)
{
    // 初始化消息队列
    struct mq_attr attr;
    attr.mq_maxmsg = 10;            // 队列中最大消息数
    attr.mq_msgsize = sizeof(Task); // 每个消息的最大字节数
    // 创建消息队列
    mqueue_mark = mq_open(mqueue_name, O_CREAT | O_RDWR, 0644, &attr);
    if (mqueue_mark == -1)
    {
        log_error("消息队列创建失败");
        return -1;
    }

    // 初始化线程池
    thread_pool = malloc(sizeof(pthread_t) * pool_size);
    thread_pool_size = pool_size;
    if (thread_pool == NULL)
    {
        log_error("线程池初始化失败");
        return -1;
    }
    // 创建线程
    for (int i = 0; i < pool_size; i++)
    {
        pthread_create(&thread_pool[i], NULL, thread_task, NULL);
    }
    return 0;
}

void app_pool_close(void)
{
    // 关闭消息队列
    mq_close(mqueue_mark);
    // 删除消息队列
    mq_unlink(mqueue_name);
    // 关闭线程
    for (int i = 0; i < thread_pool_size; i++)
    {
        pthread_cancel(thread_pool[i]);
    }
    // 释放线程池
    free(thread_pool);
}

void app_pool_resigterTask(int (*task_func)(void *), void *arg)
{
    Task task = {
        .task_func = task_func,
        .arg = arg};
    mq_send(mqueue_mark, (char *)&task, sizeof(Task), 0);
}